<!DOCTYPE html>
<html lang="zh-CN">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      //   先是预解析，
      //   debugger
      function Foo() {
        getName = function () {
          console.log(5);
        };
        return this; //此时的this指向的是这个实例对象
      }

      Foo.getName = function () {
        //添加一个静态方法
        console.log(4);
      };

      Foo.prototype.getName = function () {
        //原型添加了方法
        console.log(3);
      };

      var getName = function () {
        // 定义了一个变量为 getname = 函数
        // 函数表达式不会被提升，构造函数不会被提升
        console.log(2);
      };

      var getName = function () {
        console.log("new getname");
      };

      function getName() {
        //定义了函数
        console.log(1);
      }

      // 请说出下列执行输出结果？

      Foo.getName(); //4
      getName(); //new getname
      Foo().getName(); //5 因为函数内部的getbname被调用，全局声明的getname的被函数内部的的所改变
      getName(); //5
      getName(); //5
      new Foo.getName(); //4
      new Foo().getName(); //3 new的这个对象不存在getName这个方法，那么它会在全局里面去寻找这个getName这个方法并调用；
      new new Foo().getName(); //这里是new 了Foo这个构造函数，但是这个函数没有getName这个方法，就随着原型链去寻找，
      //原型链正好有这个getName()方法就执行

      //new做了一下几件事情
      //创建了一个实例对象（在堆开辟了一个新的空间）
      //这个实例对象的_proto__指向了构造函数的Prototype
      //将构造函数的作用域的值赋给这个实例对象（就是说构造函数的this指向这个实例对象）
      //执行构造函数中的代码(为这个实例对象添加了新的属性)
      //返回新的对象

      // new做了以下几件事
      // 创建一个新的实例对象（这个对象的类型是函数）所以会在堆开辟一个新的空间
      // 这个实例对象的__proto__指向的是这个构造函数的Prototype
      // 将构造函数的作用域里面原来的值赋值给这个新的实例对象
      // 指向构造函数的代码（为这个实例对象添加新的属性）
      // 返回新的对象

      //运算符的优先级最高的是（）》{后置递增或者是前置递增}》{逻辑非，一元加法，一元减法，前自增或者是前自减，}》{乘法，除法，取模}》{加法，减法}》{小于，小于等于，大于，大于等于}》{等号，非等好，全等号，非全等号}》{逻辑与，逻辑或，条件运算符}》{赋值=，+=，*+，/=，-=，%=}

      //运算符的优先级最高的是括号（）》{后自增跟后自减}》{逻辑非，一元加法，一元减法，前自增后自增}》{乘法，触发，取模}》{加法，减法}》{小于，小于等于，大于，大于等于}》{等于，不等于，全等，不全等}》{逻辑与，逻辑或，条件运算符}》{赋值运算符}

      // var a = { x: 1 ,
      //   valueof:function(){
      //     return this.x++;
      //   }
      // };
      // // 如何让下面的判断为true？

      // if (a == 1 && a == 2 && a == 3) { //连续调用这个a
      //   console.log("ok");
      // }else{
      //   console.log('no');
      // }

      // let a = [1,2,3,4,5,6,7,0,];
      // let b = a.map(function(val,index,valueof){
      //   console.log(index,val,valueof);
      //   return index+1;
      // });

      // console.log(b);

      // let a = [1, 2, 4, 5, 6, 7];
      // a.splice(1, 1, "red");
      // console.log(a);

      let a = [2,3,2,4,56,7,8];
      a.sort(function(value1,value2){
        return value1-value2;
      })
      console.log(a);
    </script>
  </body>
</html>
